package cn.kk.lucene.index;

import java.nio.file.Path;
import java.nio.file.Paths;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.junit.Test;

import cn.kk.lucene.IK.IKAnalyzer6x;

public class SearchIndex {
	/*
	 * 多域查询
	 */
	@Test
	public void searchMulti() throws Exception {
		// 1 路径
		Path path = Paths.get("indexdir");
		Directory dir = FSDirectory.open(path);
		// 2 搜索对象创建searcher
		// 对接一个输入流
		IndexReader reader = DirectoryReader.open(dir);
		IndexSearcher searcher = new IndexSearcher(reader);
		// 搜索使用的分词器IK
		Analyzer analyzer = new IKAnalyzer6x();
		// 3 构建查询条件
		// 指定,查询的多个域名称
		String[] fields = { "title", "data" };
		// 利用多域对象fields,和分词器构造查询条件
		// 查询条件解析器,可以收集查询的环境,生成查询条件对象
		MultiFieldQueryParser paser = new MultiFieldQueryParser(fields, analyzer);
		Query query = paser.parse("国");
		// 这条件可以使用查询,只要两个域有一个包含词项,就会搜索到
		// 打桩,输出query
		System.out.println(query.toString());
		// 4 获取数据for循环遍历;默认情况下,每个doc返回时
		// 封装到一个topDoc的对象中,底层包装了一个数组,评分
		// doc;循环数组,调用api获取数据
		TopDocs topDoc = searcher.search(query, 10);// 返回所有数据前10条
		// 封装了获取doc的所有条件的docs对象
		ScoreDoc[] docs = topDoc.scoreDocs;
		for (int i = 0; i < docs.length; i++) {
			// 获取document的文件
			Document document = searcher.doc(docs[i].doc);
			System.out.println("id:" + document.get("id"));
			System.out.println("title:" + document.get("title"));
			System.out.println("data:" + document.get("data"));
		}

	}

	/*
	 * 词项查询
	 */
	@Test
	public void termQuery() throws Exception {
		// 1 路径
		Path path = Paths.get("indexdir");
		Directory dir = FSDirectory.open(path);
		// 2 搜索对象创建searcher
		// 对接一个输入流
		IndexReader reader = DirectoryReader.open(dir);
		IndexSearcher searcher = new IndexSearcher(reader);
		// 搜索使用的分词器IK
		Analyzer analyzer = new IKAnalyzer6x();

		// TODO 词项查询条件
		Term term = new Term("title", "测试");
		Query query = new TermQuery(term);

		System.out.println("query条件:" + query.toString());
		// 4 获取数据for循环遍历;默认情况下,每个doc返回时
		// 封装到一个topDoc的对象中,底层包装了一个数组,评分
		// doc;循环数组,调用api获取数据
		TopDocs topDoc = searcher.search(query, 10);// 返回所有数据前10条
		// 封装了获取doc的所有条件的docs对象
		ScoreDoc[] docs = topDoc.scoreDocs;
		for (int i = 0; i < docs.length; i++) {
			// 获取document的文件
			Document document = searcher.doc(docs[i].doc);
			System.out.println("id:" + document.get("id"));
			System.out.println("title:" + document.get("title"));
			System.out.println("data:" + document.get("data"));
		}
	}

}
